/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package utils;//统一封装和格式化是被结果，为上层提供一致的数据接口

/**
 *
 * @author Raise
 */

//包含预测结果、置信度、概率分布等全方位信息
//明确区分失败和成功两种情况，并针对不同情况提供合适的处理方法
//内置格式化方法，可以在用户界面直接使用
//通过克隆保护内部信息，防止意外修改
//提供详细的概率信息来帮助分析模型的表现和改进方向

public class RecognitionResult {
    //封装识别结果的所有相关信息，提供完整的结果信息，便于显示、记录和分析
    private int predictedDigit; //预测的数字
    private double confidence; //置信度
    private double[] probabilities; //所有数字的概率分布
    private String imagePath; //图片路径
    private boolean isSuccessful; //识别是否成功
    
    //提供两种构造函数，分别用于成功和失败的情况，可以适应不同情况，程序不易崩溃

    //构造函数（识别成功时使用）
    public RecognitionResult(int predictedDigit, double confidence, double[] probabilities, String imagePath, boolean isSuccessful) {
        this.predictedDigit = predictedDigit;
        this.confidence = confidence;

        //使用clone（）复制数组，防止外部修改影响内部的数据，保证数据完整性
        this.probabilities = probabilities.clone();
        this.imagePath = imagePath;
        this.isSuccessful = isSuccessful;
    }
    
    // 专门构造一个识别失败的结果的函数，统一错误处理，减少空指针异常,即识别失败时使用
    public RecognitionResult(String imagePath) {
        this.imagePath = imagePath;
        this.isSuccessful = false;
        this.predictedDigit = -1; //用-1表示识别失败
        this.confidence = 0;
        this.probabilities = new double[10];
    }
    
    // 以下是一系列的Getters方法
    public int getPredictedDigit() { return predictedDigit; }
    public double getConfidence() { return confidence; }
    public double[] getProbabilities() { return probabilities.clone(); }//返回克隆，保护内部数组
    public String getImagePath() { return imagePath; }
    public boolean isSuccessful() { return isSuccessful; }
    
    //提供格式化的置信度输出，可以直接在用户界面显示，无需额外格式化代码
    //将置信度格式化为百分比字符串
    public String getFormattedConfidence() {
        return String.format("%.2f%%", confidence * 100);
    }
    
    //获取每个数字的概率详细信息（字符串形式）
    //生成详细的概率分布信息，便于调试和分析模型行为，了解模型的不确定性
    public String getProbabilityDetails() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < probabilities.length; i++) {
            sb.append(String.format("数字 %d: %.4f (%.2f%%)%n", 
                i, probabilities[i], probabilities[i] * 100));
        }
        return sb.toString();
    }
    
    //从图片路径中提取文件名
    public String getFileName() {
        return new java.io.File(imagePath).getName();
    }
}
